﻿using sipfe.model.dataAccess;
using sipfe.util;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity.Validation;
using System.Diagnostics;
using System.Linq;
using System.Text;

namespace sipfe.model.persona
{
    public class PersonaDAO
    {
        private BDSIPFEEntities db = new BDSIPFEEntities();

        public String[] AgregarTablaInpDAO(SIPMaePersona sipMaePersona)
        {
            String error = "1";
            String rpta = "1";
            try
            {
              //  sipMaePersona.nIdePersona = null;
               // sipMaePersona.SIPDetDireccion.Add(sipMaePersona.SIPDetDireccion1);
                sipMaePersona.SIPDetEstadoCivil.Add(sipMaePersona.SIPDetEstadoCivil1);
                if (sipMaePersona.SIPDetTelefono1 != null)
                {
                    if (sipMaePersona.SIPDetTelefono1.vPrefijo != null)
                    {
                        sipMaePersona.SIPDetTelefono.Add(sipMaePersona.SIPDetTelefono1);
                    }
                }
                if (sipMaePersona.SIPDetTelefono2 != null)
                {
                    if (sipMaePersona.SIPDetTelefono2.vPrefijo != null)
                    {
                        sipMaePersona.SIPDetTelefono.Add(sipMaePersona.SIPDetTelefono2);
                    }
                }
                if (sipMaePersona.SIPDetCorreo1 != null)
                {
                    if (sipMaePersona.SIPDetCorreo1.vCorreo != null)
                    {
                        sipMaePersona.SIPDetCorreo.Add(sipMaePersona.SIPDetCorreo1);
                    }
                }
                db.SIPMaePersona.Add(sipMaePersona);
                db.SaveChanges();
            }
            catch (DbEntityValidationException dbEx)
            {
                rpta = "error";
                var errorMessages = dbEx.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage);

                var fullErrorMessage = string.Join("; ", errorMessages);

                var exceptionMessage = string.Concat(dbEx.Message, " The validation errors are: ", fullErrorMessage);
                throw new DbEntityValidationException(exceptionMessage, dbEx.EntityValidationErrors);
            }
            rpta = sipMaePersona.nIdePersona.ToString();

            return new String[] { sipMaePersona.nIdePersona.ToString(), sipMaePersona.nIdePaisNac.ToString(), 
                                sipMaePersona.nIdeTipoDocum.ToString(), sipMaePersona.vPriNombre +" "+sipMaePersona.vPriApellido +" "+ 
                                sipMaePersona.vSegApellido,sipMaePersona.vNumDocum};
        }


        public String[] addHijoAlaDependenciaDAO_old(SIPMaeDependencia sipMaeDependencia)
        {
            db.SIPMaeDependencia.Add(sipMaeDependencia);
            db.SaveChanges();
            return new String[] { sipMaeDependencia.nIdeDep.ToString(), sipMaeDependencia.vDescripcion };
        }

        public List<SIPMaePersona> ListaDatosPersonasDAO(int n_IdePersona)
        {
            return db.SIPMaePersona.Where(x => x.nIdePersona == n_IdePersona).ToList();
        }

        public int CheckEstodoCivilExisteDAO(int n_IdePersona, int idEstadoCivil)
        {
            int rpta = db.SIPDetEstadoCivil.Where(s => s.nIdePersona == n_IdePersona && s.nIdeEstadoCivil == idEstadoCivil && (s.dFecFinVig == null ? DateTime.Now : s.dFecFinVig) >= DateTime.Now && s.dFecIniVig <= DateTime.Now).Count();
            return rpta>0?1:0;
        }

        public void UpdateEstodoCivilDAO(int n_IdePersona, int idEstadoCivil, int n_IdeUsuario)
        {
            DateTime ayer = UtilitariosUtil.FechaAyer();
            DateTime hoy = UtilitariosUtil.FechaHoy();
            SIPDetEstadoCivil sipDetEstadoCivil = new SIPDetEstadoCivil();
            sipDetEstadoCivil.nIdePersona       =   n_IdePersona;
            sipDetEstadoCivil.nIdeEstadoCivil   =   idEstadoCivil;
            sipDetEstadoCivil.dFecIniVig        =   hoy;
            sipDetEstadoCivil.dtFecReg          =   DateTime.Now;
            sipDetEstadoCivil.nIdeUsuReg        =   n_IdeUsuario;
            db.SIPDetEstadoCivil.Add(sipDetEstadoCivil);

            //cerramos la fecha d vigencia
            var ListaOld = db.SIPDetEstadoCivil.Where(s => s.nIdePersona == n_IdePersona && s.dFecFinVig == null).ToList();
            ListaOld.ForEach(x => x.dFecFinVig = ayer);
            db.SaveChanges();
        }

        public void AgregarTelefonoDAO(int n_IdePersona, int n_IdeUsuario, string v_Prefijo, string v_NumTelefono)
        {
            DateTime hoy = UtilitariosUtil.FechaHoy();
            SIPDetTelefono sipDetTelefono = new SIPDetTelefono();
            sipDetTelefono.nIdePersona  = n_IdePersona;
            sipDetTelefono.vPrefijo     = v_Prefijo;
            sipDetTelefono.vNumTel      = v_NumTelefono;
            sipDetTelefono.nIdeUsuReg   = n_IdeUsuario;
            sipDetTelefono.dtFecReg     = DateTime.Now;
            sipDetTelefono.dFecIniVig   = hoy;
            db.SIPDetTelefono.Add(sipDetTelefono);
            db.SaveChanges();
        }

        public void AgregarCorreoElectronicoDAO(int n_IdePersona, int n_IdeUsuario, string v_Correo)
        {
            DateTime hoy = UtilitariosUtil.FechaHoy();
            SIPDetCorreo sipDetCorreo = new SIPDetCorreo();
            sipDetCorreo.nIdePersona    =   n_IdePersona;
            sipDetCorreo.vCorreo        =   v_Correo;
            sipDetCorreo.nIdeUsuReg     =   n_IdeUsuario;
            sipDetCorreo.dFecReg        =   DateTime.Now;
            sipDetCorreo.dFecIniVig     =   hoy;
            db.SIPDetCorreo.Add(sipDetCorreo);
            db.SaveChanges();
        }

        public void AgregarDireccionInvDAO(SIPDetDireccion direccion)
        {
            DateTime hoy = UtilitariosUtil.FechaHoy();
            DateTime ayer = UtilitariosUtil.FechaAyer();            
            direccion.dFecIniVig = hoy;
            direccion.dtFecReg = DateTime.Now;
            db.SIPDetDireccion.Add(direccion);


            //cerramos la fecha de vigencia de las direcciones anteriores
            var ListaOld = db.SIPDetDireccion.Where(s => s.nIdePersona == direccion.nIdePersona && s.dFecFinVig == null).ToList();
            ListaOld.ForEach(x => x.dFecFinVig = ayer);
            db.SaveChanges();


            //db.SaveChanges();

        }

        public void RegistraInfoAcademicaInvDAO(int n_IdeNivelEstudio, int n_IdeTipoInst, int n_IdeInstitucion, string d_FecIniAct,
                                                string d_FecFinAct, string n_Promedio, int n_IdeTipoEstudio, int n_IdeGrado,
                                                int n_IdeUsuario, int n_IdePersona, string cadenaNotas, string n_IdeCarrera,
                                                string n_AnnioCur, string n_IdeEscala, string n_IdeDesemp,
                                                string n_IdeCiclo, string v_Campus, string n_CodigoUni, string n_CostoMensual, 
                                                string n_CostoMatricula)
        {
            SIPDetCentroEstudio ce = new SIPDetCentroEstudio();
            DateTime hoy = UtilitariosUtil.FechaHoy();

            try
            {
                //registramos notas si existen
                SIPDetBoletaNota nota;

                if (!string.IsNullOrEmpty(cadenaNotas))
                {
                    string[] arrayNotas = cadenaNotas.Split(',');

                    for (int i = 0; i < arrayNotas.Length; i++)
                    {
                        nota = new SIPDetBoletaNota();
                        nota.nIdeAreaAprendi = 1;
                        nota.dFecIniAct = UtilitariosUtil.formatearFecha(d_FecIniAct);
                        nota.dFecFinAct = UtilitariosUtil.formatearFecha(d_FecFinAct);
                        nota.dFecIniVige = hoy;
                        nota.nNotaProm = Convert.ToDecimal(arrayNotas[i]);
                       ce.SIPDetBoletaNota.Add(nota);
                    }
                }
                ce.nIdeNivel = n_IdeNivelEstudio;
                ce.nIdeTipoInstitucion = n_IdeTipoInst;
                ce.nIdeInstitucion = n_IdeInstitucion;
                ce.dFecIniVig = hoy;
                ce.dFecIniAct = UtilitariosUtil.formatearFecha(d_FecIniAct);
                ce.dFecFinAct = UtilitariosUtil.formatearFecha(d_FecFinAct);
                ce.vPromedio = n_Promedio;
                if (n_IdeTipoEstudio > 0) ce.nIdeTipoEstudio = n_IdeTipoEstudio;
                if (n_IdeGrado > 0) ce.nIdeGrado = n_IdeGrado;
                ce.dtFecReg = DateTime.Now;
                ce.nIdeUsuReg = n_IdeUsuario;
                ce.nIdePersona = n_IdePersona;
                if (!string.IsNullOrEmpty(n_IdeCarrera)) ce.nIdeCarrera = Int32.Parse(n_IdeCarrera);
                if (!string.IsNullOrEmpty(n_AnnioCur)) ce.nAnioCursa = Int32.Parse(n_AnnioCur);
                if (!string.IsNullOrEmpty(n_IdeEscala)) ce.nIdeEscala = Int32.Parse(n_IdeEscala);
                if (!string.IsNullOrEmpty(n_IdeDesemp)) ce.nIdeDesempe = Int32.Parse(n_IdeDesemp);
                if (!string.IsNullOrEmpty(n_IdeCiclo)) ce.nIdeCiclo = Int32.Parse(n_IdeCiclo);
                if (!string.IsNullOrEmpty(n_CostoMensual)) ce.nCostoMensual = Decimal.Parse(n_CostoMensual);
                if (!string.IsNullOrEmpty(n_CostoMatricula)) ce.nCostoMatricula = Decimal.Parse(n_CostoMatricula);
                ce.vCampus =    v_Campus.ToUpper();
                ce.vCodUni =    n_CodigoUni.ToUpper();
                db.SIPDetCentroEstudio.Add(ce);
                db.SaveChanges();
            }
            catch (DbEntityValidationException dbEx)
            {
               var errorMessages = dbEx.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage);
                var fullErrorMessage = string.Join("; ", errorMessages);
                var exceptionMessage = string.Concat(dbEx.Message, " The validation errors are: ", fullErrorMessage);
                throw new DbEntityValidationException(exceptionMessage, dbEx.EntityValidationErrors);
            }            
        }

        public List<SIPMaePersona> RegistraInfoAIdiomaInvDAO(int nIdeHabla, int nIdeLee, int n_IdeEscribe, int n_IdeNivelIdioma,
                                                            int n_CertiIdioma, int n_IdeUsuario, int n_IdePersona, int n_Idioma)
        {

            SIPDetIdioma ce = new SIPDetIdioma();
            DateTime hoy = UtilitariosUtil.FechaHoy();

            try
            {
                ce.nIdeTipoIdioma   =   n_Idioma;
                ce.nIdeNivel        =   n_IdeNivelIdioma;
                ce.nHabla           =   nIdeHabla;
                ce.nLee             =   nIdeLee;
                ce.nEscribe         =   n_IdeEscribe;
                ce.dFecIniVig       =   hoy;
                if (n_CertiIdioma > 0) ce.nIdeCerti = n_CertiIdioma;
                ce.dtFecReg         =   DateTime.Now;
                ce.nIdeUsuReg       =   n_IdeUsuario;
                ce.nIdePersona      =   n_IdePersona;
                db.SIPDetIdioma.Add(ce);
                db.SaveChanges();
            }
            catch (DbEntityValidationException dbEx)
            {
                var errorMessages = dbEx.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage);
                var fullErrorMessage = string.Join("; ", errorMessages);
                var exceptionMessage = string.Concat(dbEx.Message, " The validation errors are: ", fullErrorMessage);
                throw new DbEntityValidationException(exceptionMessage, dbEx.EntityValidationErrors);
            }            
            db = new BDSIPFEEntities();
            return db.SIPMaePersona.Where(x => x.nIdePersona == n_IdePersona).ToList();
        }

        public List<SIPMaePersona> RegistraInfoOtrosEstudiosInvDAO(int n_OtroEstudio, int n_IdeInstitucionOtro, int n_AnioOtro, int n_TipoOtroEstudio, int n_IdeUsuario, int n_IdePersona)
        {
            SIPDetOtroEstudio item = new SIPDetOtroEstudio();
            DateTime hoy = UtilitariosUtil.FechaHoy();

            try
            {
                item.nAnio = n_AnioOtro;
                item.nIdeEstudio = n_OtroEstudio;
                item.nIdeInstitucion = n_IdeInstitucionOtro;                                
                item.dFecIniVig = hoy;
                if (n_TipoOtroEstudio > 0) item.nIdeTipoEstudio = n_TipoOtroEstudio;
                item.dtFecReg = DateTime.Now;
                item.nIdeUsu = n_IdeUsuario;
                item.nIdePersona = n_IdePersona;
                db.SIPDetOtroEstudio.Add(item);
                db.SaveChanges();
            }
            catch (DbEntityValidationException dbEx)
            {
                var errorMessages = dbEx.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage);
                var fullErrorMessage = string.Join("; ", errorMessages);
                var exceptionMessage = string.Concat(dbEx.Message, " The validation errors are: ", fullErrorMessage);
                throw new DbEntityValidationException(exceptionMessage, dbEx.EntityValidationErrors);
            }
            db = new BDSIPFEEntities();
            return db.SIPMaePersona.Where(x => x.nIdePersona == n_IdePersona).ToList();
        }

        public List<SIPMaePersona> RegistraInfoReconocimientoDAO(int n_IdeRecono, int n_IdeInstitutoRecono, int n_AnioRecono, int n_TipoRecono, int n_IdeUsuario, int n_IdePersona)
        {
            SIPDetReconocimiento item = new SIPDetReconocimiento();
            DateTime hoy = UtilitariosUtil.FechaHoy();

            try
            {
                item.nAnio = n_AnioRecono;
                item.nIdeInstitucion = n_IdeInstitutoRecono;               
                item.dFecIniVig = hoy;
                if (n_TipoRecono > 0) item.nIdeTipoReco = n_TipoRecono;
                item.dtFecReg = DateTime.Now;
                item.nIdeUsuReg = n_IdeUsuario;
                item.nIdePersona = n_IdePersona;
                item.nRecono = n_IdeRecono;
                db.SIPDetReconocimiento.Add(item);
                db.SaveChanges();
            }
            catch (DbEntityValidationException dbEx)
            {
                var errorMessages = dbEx.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage);
                var fullErrorMessage = string.Join("; ", errorMessages);
                var exceptionMessage = string.Concat(dbEx.Message, " The validation errors are: ", fullErrorMessage);
                throw new DbEntityValidationException(exceptionMessage, dbEx.EntityValidationErrors);
            }
            db = new BDSIPFEEntities();
            return db.SIPMaePersona.Where(x => x.nIdePersona == n_IdePersona).ToList();
        }

        public List<SIPMaePersona> RegistraInfoTrabajoSocialInvDAO(int n_IdeTipoTrabajo, int n_AnioTrabajo, string v_DescTrabajo, int n_IdeUsuario, int n_IdePersona)
        {
            SIPDetTrabajoSocial item = new SIPDetTrabajoSocial();
            DateTime hoy = UtilitariosUtil.FechaHoy();

            try
            {
                item.nAnio = n_AnioTrabajo;
                item.nIdeTipoTrabajo = n_IdeTipoTrabajo;
                item.dFecIniVig = hoy;
                item.dtFecReg = DateTime.Now;
                item.nIdeUsuReg = n_IdeUsuario;
                item.nIdePersona = n_IdePersona;
                item.vDescr =    v_DescTrabajo.ToUpper();
                db.SIPDetTrabajoSocial.Add(item);
                db.SaveChanges();
            }
            catch (DbEntityValidationException dbEx)
            {
                var errorMessages = dbEx.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage);
                var fullErrorMessage = string.Join("; ", errorMessages);
                var exceptionMessage = string.Concat(dbEx.Message, " The validation errors are: ", fullErrorMessage);
                throw new DbEntityValidationException(exceptionMessage, dbEx.EntityValidationErrors);
            }
            db = new BDSIPFEEntities();
            return db.SIPMaePersona.Where(x => x.nIdePersona == n_IdePersona).ToList();
        }

        public int AddNuevaIntitucionFinalDAO(int nIdeCodPaisDoc, int nIdeTipoDocum, string NumDocInstitucion, string vRazonSocial, int n_IdeUsuario)
        {
            SIPMaeEmpresa item = new SIPMaeEmpresa();
            DateTime hoy = UtilitariosUtil.FechaHoy();

            try
            {
                
                item.dFecIniVig     =   hoy;
                item.dtFecReg       =   DateTime.Now;
                item.nIdeUsuReg     =   n_IdeUsuario;

                item.nIdeCodPaisDoc =   nIdeCodPaisDoc;
                item.nIdeTipoDocum  =   nIdeTipoDocum;
                item.vNumDocum      =   NumDocInstitucion;
                item.vRazonSocial   =   vRazonSocial.ToUpper();
                db.SIPMaeEmpresa.Add(item);
                db.SaveChanges();
            }
            catch (DbEntityValidationException dbEx)
            {
                var errorMessages = dbEx.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage);
                var fullErrorMessage = string.Join("; ", errorMessages);
                var exceptionMessage = string.Concat(dbEx.Message, " The validation errors are: ", fullErrorMessage);
                throw new DbEntityValidationException(exceptionMessage, dbEx.EntityValidationErrors);
            }            
            return Int32.Parse(item.nIdeEmpresa.ToString());
        }

        public List<SIPMaePersona> RegistraInfoSocioEconomicaInvDAO(int n_NummiembrosFam, int n_JefeFamilia, int n_NumDependientes, int n_IdeProfesion, 
                                                    int n_IdeTipoVivienda, decimal n_ValorComercial, int n_IdeUsuario, int n_IdePersona)
        {
            SIPDetSocioEcono item = new SIPDetSocioEcono();
            DateTime hoy = UtilitariosUtil.FechaHoy();

            try
            {
                item.dFecIniVig         =   hoy;
                item.dtFecReg           =   DateTime.Now;
                item.nIdeUsuReg         =   n_IdeUsuario;
                item.nDependientes      =   n_NumDependientes;
                item.nIdePersona        =   n_IdePersona;
                item.nIdeProfesion      =   n_IdeProfesion;
                item.nIdeTipoVivienda   =   n_IdeTipoVivienda;
                item.nJefe              =   n_JefeFamilia;
                item.nMiembros          =   n_NummiembrosFam;
                item.nValorComercial    =   n_ValorComercial;
                db.SIPDetSocioEcono.Add(item);
                db.SaveChanges();
            }
            catch (DbEntityValidationException dbEx)
            {
                var errorMessages = dbEx.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage);
                var fullErrorMessage = string.Join("; ", errorMessages);
                var exceptionMessage = string.Concat(dbEx.Message, " The validation errors are: ", fullErrorMessage);
                throw new DbEntityValidationException(exceptionMessage, dbEx.EntityValidationErrors);
            }
            db = new BDSIPFEEntities();
            return db.SIPMaePersona.Where(x => x.nIdePersona == n_IdePersona).ToList();           
        }

        public List<SIPMaePersona> RegistrarRefFamiliarSocioInvDAO(int n_IdePersonaSocio, int n_IdeParentesco, int n_IdeTrabaja, int n_IdeViveContigo, 
                                                                    int n_IdeCie10, decimal n_Remuneracion, int n_IdeUsuario, int n_IdePersona)
        {
            SIPDetVinculoFamilia item = new SIPDetVinculoFamilia();
            DateTime hoy = UtilitariosUtil.FechaHoy();

            try
            {
                item.dFecIniVig         =   hoy;
                item.dtFecReg           =   DateTime.Now;
                item.nIdeUsuReg         =   n_IdeUsuario;
                if (n_IdeCie10 > 0) item.nIdeDiag = n_IdeCie10; ;
                item.nIdeTipoVinculo    =   n_IdeParentesco;
                item.nRemunera          =   n_Remuneracion;
                item.nTrabaja           =   n_IdeTrabaja;
                item.nVive              =   n_IdeViveContigo;
                item.nIdePersona        =   n_IdePersona;
                item.nIdePersonaVin     = n_IdePersonaSocio;
                db.SIPDetVinculoFamilia.Add(item);
                db.SaveChanges();
            }
            catch (Exception dbEx)
            {
                var errorMessages = dbEx.StackTrace;
                
               // var errorMessages = dbEx.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage);
                var fullErrorMessage = string.Join("; ", errorMessages);
                var exceptionMessage = string.Concat(dbEx.Message, " The validation errors are: ", fullErrorMessage);
                //throw new DbEntityValidationException(exceptionMessage, dbEx.EntityValidationErrors);
            }
            db = new BDSIPFEEntities();
            return db.SIPMaePersona.Where(x => x.nIdePersona == n_IdePersona).ToList(); 
        }

        public List<SIPMaePersona> RegistraDatosLaboralesInvDAO(int n_IdeEmpresaLabora, int n_IdeEstadoLaboral, int n_IdeCargoLaboral, 
                                                                decimal n_RemuneNeta, string d_FecIngresoLabo, int n_IdeCondicionLaboral, 
                                                                int n_IdeUsuario, int n_IdePersona, string v_CodigoTrab, string n_IdeDpto,
                                                                string n_IdeProv, string n_IdeDistrito, string n_IdeTipoTrab, string d_FecFinLabo,
                                                                string n_rph, string n_IdeTipoSede, string v_NombreSede)
        {
            SIPDetLaboral item = new SIPDetLaboral();
            DateTime hoy = UtilitariosUtil.FechaHoy();

            try
            {
                item.dFecIniVig     =   hoy;
                item.dtFecReg       =   DateTime.Now;
                item.nIdeUsu        =   n_IdeUsuario;
                item.dFecIngreso    =   UtilitariosUtil.formatearFecha(d_FecIngresoLabo);
                item.nIdeCargo      =   n_IdeCargoLaboral;
                item.nIdeEmpresa    =   n_IdeEmpresaLabora;
                item.nIdeEstado     =   n_IdeEstadoLaboral;
                item.nIdePersona    =   n_IdePersona;
                item.nRemunera      =   n_RemuneNeta;
                item.nIdeCondicion  =   n_IdeCondicionLaboral;
                item.vCodigoTrab    =   v_CodigoTrab;                
                item.nIdeDpto       =   Int32.Parse(n_IdeDpto);
                item.nIdeProv       =   Int32.Parse(n_IdeProv);
                item.nIdeDistrito   =   Int32.Parse(n_IdeDistrito);
                if (!string.IsNullOrEmpty(v_NombreSede)) item.vNombreSede = v_NombreSede.ToUpper(); 
                if (!string.IsNullOrEmpty(n_IdeTipoTrab)) item.nIdeTipoTrab = Int32.Parse(n_IdeTipoTrab);
                if (!string.IsNullOrEmpty(n_IdeTipoSede)) item.nIdeTipoSede = Int32.Parse(n_IdeTipoSede); 
                if (!string.IsNullOrEmpty(d_FecFinLabo)) item.dFecFinLabor = UtilitariosUtil.formatearFecha(d_FecIngresoLabo);
                if (!string.IsNullOrEmpty(n_rph)) item.nRph = Int32.Parse(n_rph); 
                db.SIPDetLaboral.Add(item);
                db.SaveChanges();
            }
            catch (Exception dbEx)
            {
                var errorMessages = dbEx.StackTrace;

                // var errorMessages = dbEx.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage);
                var fullErrorMessage = string.Join("; ", errorMessages);
                var exceptionMessage = string.Concat(dbEx.Message, " The validation errors are: ", fullErrorMessage);
                //throw new DbEntityValidationException(exceptionMessage, dbEx.EntityValidationErrors);
            }
            db = new BDSIPFEEntities();
            return db.SIPMaePersona.Where(x => x.nIdePersona == n_IdePersona).ToList(); 
        }

        public List<SIPMaePersona> RegistraOtrosIngresosInvDAO(int n_IdeOtroIngreso, int n_MontoOtroIngreso, int n_IdeUsuario, int n_IdePersona, int tipo)
        {
            SIPDetOtroIngreso item = new SIPDetOtroIngreso();
            DateTime hoy = UtilitariosUtil.FechaHoy();

            try
            {               
                item.dtFecIniVig = hoy;
                item.dtFecReg = DateTime.Now;
                item.nIdeUsuReg = n_IdeUsuario;               
                item.nIdePersona = n_IdePersona;
                item.nMonto = n_MontoOtroIngreso;
                item.nIdeTipoIngreso = n_IdeOtroIngreso;
                item.nIdeTipoItem = (tipo == 1 ? Constante.TIPO_ITEM_INGRESO_EGRESO.INGRESO : Constante.TIPO_ITEM_INGRESO_EGRESO.EGRESO);
                db.SIPDetOtroIngreso.Add(item);
                db.SaveChanges();
            }
            catch (Exception dbEx)
            {
                var errorMessages = dbEx.StackTrace;

                // var errorMessages = dbEx.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage);
                var fullErrorMessage = string.Join("; ", errorMessages);
                var exceptionMessage = string.Concat(dbEx.Message, " The validation errors are: ", fullErrorMessage);
                //throw new DbEntityValidationException(exceptionMessage, dbEx.EntityValidationErrors);
            }
            db = new BDSIPFEEntities();
            return db.SIPMaePersona.Where(x => x.nIdePersona == n_IdePersona).ToList(); 
        }

        public List<SIPMaePersona> RegistraDatosBeneficioInvServiceDAO(int n_IdeIntitutoBene, int n_IdeTipoBene, int n_AnioBene, int n_IdeConceptoBene, 
                                                                        decimal n_CostoBene, decimal n_PorceBeca, decimal n_PorceCredito, int n_IdeUsuario, int n_IdePersona)
        {
            SIPDetBeneficio item = new SIPDetBeneficio();
            DateTime hoy = UtilitariosUtil.FechaHoy();

            try
            {
                item.dFecIniVig         = hoy;
                item.dtFecReg           = DateTime.Now;
                item.nIdeUsuReg         = n_IdeUsuario;
                item.nIdePersona        = n_IdePersona;
                item.nAnio              = n_AnioBene;
                item.nCosto             = n_CostoBene;
                item.nIdeInstitucion    = n_IdeIntitutoBene;
                item.nIdePrograma       = n_IdeConceptoBene;
                item.nIdeTipoBene       = n_IdeTipoBene;
                item.nPorBeca           = n_PorceBeca;
                item.nPorCredito        = n_PorceCredito;
                db.SIPDetBeneficio.Add(item);
                db.SaveChanges();
            }
            catch (Exception dbEx)
            {
                var errorMessages = dbEx.StackTrace;

                // var errorMessages = dbEx.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage);
                var fullErrorMessage = string.Join("; ", errorMessages);
                var exceptionMessage = string.Concat(dbEx.Message, " The validation errors are: ", fullErrorMessage);
                //throw new DbEntityValidationException(exceptionMessage, dbEx.EntityValidationErrors);
            }
            db = new BDSIPFEEntities();
            return db.SIPMaePersona.Where(x => x.nIdePersona == n_IdePersona).ToList(); 
        }

        public List<SIPMaePersona> UpdateEstodoCivilManteDAO(int n_IdePersona, int idEstadoCivil, int n_IdeUsuario)
        {
            DateTime ayer = UtilitariosUtil.FechaAyer();
            DateTime hoy = UtilitariosUtil.FechaHoy();
            SIPDetEstadoCivil sipDetEstadoCivil = new SIPDetEstadoCivil();
            sipDetEstadoCivil.nIdePersona = n_IdePersona;
            sipDetEstadoCivil.nIdeEstadoCivil = idEstadoCivil;
            sipDetEstadoCivil.dFecIniVig = hoy;
            sipDetEstadoCivil.dtFecReg = DateTime.Now;
            sipDetEstadoCivil.nIdeUsuReg = n_IdeUsuario;
            db.SIPDetEstadoCivil.Add(sipDetEstadoCivil);

            //cerramos la fecha d vigencia
            var ListaOld = db.SIPDetEstadoCivil.Where(s => s.nIdePersona == n_IdePersona && s.dFecFinVig == null).ToList();
            ListaOld.ForEach(x => x.dFecFinVig = ayer);
            db.SaveChanges();

            db = new BDSIPFEEntities();
            return db.SIPMaePersona.Where(x => x.nIdePersona == n_IdePersona).ToList(); 
        }

        public List<SIPMaePersona> AgregaTelefonoManteDAO(int n_IdePersona, int n_IdeUsuario, string v_Prefijo, string v_NumTelefono)
        {
            DateTime hoy = UtilitariosUtil.FechaHoy();
            SIPDetTelefono sipDetTelefono = new SIPDetTelefono();
            sipDetTelefono.nIdePersona = n_IdePersona;
            sipDetTelefono.vPrefijo = v_Prefijo;
            sipDetTelefono.vNumTel = v_NumTelefono;
            sipDetTelefono.nIdeUsuReg = n_IdeUsuario;
            sipDetTelefono.dtFecReg = DateTime.Now;
            sipDetTelefono.dFecIniVig = hoy;
            db.SIPDetTelefono.Add(sipDetTelefono);
            db.SaveChanges();
            db = new BDSIPFEEntities();
            return db.SIPMaePersona.Where(x => x.nIdePersona == n_IdePersona).ToList(); 
        }

        public List<SIPMaePersona> AgregaCorreoElectronicoManteDAO(int n_IdePersona, int n_IdeUsuario, string v_Correo)
        {
            DateTime hoy = UtilitariosUtil.FechaHoy();
            SIPDetCorreo sipDetCorreo = new SIPDetCorreo();
            sipDetCorreo.nIdePersona = n_IdePersona;
            sipDetCorreo.vCorreo = v_Correo;
            sipDetCorreo.nIdeUsuReg = n_IdeUsuario;
            sipDetCorreo.dFecReg = DateTime.Now;
            sipDetCorreo.dFecIniVig = hoy;
            db.SIPDetCorreo.Add(sipDetCorreo);
            db.SaveChanges();
            db = new BDSIPFEEntities();
            return db.SIPMaePersona.Where(x => x.nIdePersona == n_IdePersona).ToList();
        }

        public List<SIPMaePersona> AgregarDireccionPersonaManteDAO(SIPDetDireccion direccion)
        {
            DateTime hoy = UtilitariosUtil.FechaHoy();
            DateTime ayer = UtilitariosUtil.FechaAyer();
            direccion.dFecIniVig = hoy;
            direccion.dtFecReg = DateTime.Now;
           // decimal n_IdePersona =    direccion.nIdePersona;


            db.SIPDetDireccion.Add(direccion);

            //cerramos la fecha de vigencia de las direcciones anteriores direccion.nIdePersona
            var ListaOld = db.SIPDetDireccion.Where(s => s.nIdePersona == direccion.nIdePersona && s.dFecFinVig == null).ToList();
            ListaOld.ForEach(x => x.dFecFinVig = ayer);
            db.SaveChanges();
            //return listaPersonaById(direccion.nIdePersona);
            db = new BDSIPFEEntities();
            return db.SIPMaePersona.Where(x => x.nIdePersona == direccion.nIdePersona).ToList();
        }

        public List<SIPMaePersona> ListaPersonaManteManteDAO(string v_NombresPersona)
        {
            var resultado = db.SIPMaePersona.Where(s => (s.vPriNombre + s.vPriApellido+s.vSegApellido).Contains(v_NombresPersona)).OrderBy(s => s.vPriApellido).ToList();
            return resultado;
        }


        public int CheckExisteDocumentoPersonaManteDAO(int n_IdeCodPaisDoc, int n_IdeTipoDocum, string v_numDocum, string sw, 
                                                       string n_IdePersona, string tipoPersona)
        {
            int rpta = 1;
            if (sw.Equals("1"))
            {
                if (tipoPersona.Equals("1"))
                {
                    rpta = db.SIPMaePersona.Where(s => s.nIdeCodPaisDoc == n_IdeCodPaisDoc && s.nIdeTipoDocum == n_IdeTipoDocum && s.vNumDocum == v_numDocum).Count();
                }else{
                    rpta = db.SIPMaeEmpresa.Where(s => s.nIdeCodPaisDoc == n_IdeCodPaisDoc && s.nIdeTipoDocum == n_IdeTipoDocum && s.vNumDocum == v_numDocum).Count();
                }
            }
            else if (sw.Equals("2"))
            {                
                if (tipoPersona.Equals("1"))
                {
                    if (string.IsNullOrEmpty(n_IdePersona))
                    {
                        rpta = db.SIPMaePersona.Where(s => s.nIdeCodPaisDoc == n_IdeCodPaisDoc && s.nIdeTipoDocum == n_IdeTipoDocum && s.vNumDocum == v_numDocum).Count();
                    }
                    else
                    {
                        int n_IdePersonaInt = Int32.Parse(n_IdePersona);
                        rpta = db.SIPMaePersona.Where(s => s.nIdeCodPaisDoc == n_IdeCodPaisDoc && s.nIdeTipoDocum == n_IdeTipoDocum && s.vNumDocum == v_numDocum && s.nIdePersona != n_IdePersonaInt).Count();
                    }
                }
                else
                {
                    if (string.IsNullOrEmpty(n_IdePersona))
                    {
                        rpta = db.SIPMaeEmpresa.Where(s => s.nIdeCodPaisDoc == n_IdeCodPaisDoc && s.nIdeTipoDocum == n_IdeTipoDocum && s.vNumDocum == v_numDocum).Count();
                    }
                    else
                    {
                        int n_IdePersonaInt = Int32.Parse(n_IdePersona);
                        rpta = db.SIPMaeEmpresa.Where(s => s.nIdeCodPaisDoc == n_IdeCodPaisDoc && s.nIdeTipoDocum == n_IdeTipoDocum && s.vNumDocum == v_numDocum && s.nIdeEmpresa != n_IdePersonaInt).Count();
                    }
                }                
            }
            return rpta > 0 ? 1 : 0;
        }



        public int CheckEstodoCivilExisteDAO_old(int n_IdePersona, int idEstadoCivil)
        {
            int rpta = db.SIPDetEstadoCivil.Where(s => s.nIdePersona == n_IdePersona && s.nIdeEstadoCivil == idEstadoCivil && (s.dFecFinVig == null ? DateTime.Now : s.dFecFinVig) >= DateTime.Now && s.dFecIniVig <= DateTime.Now).Count();
            return rpta > 0 ? 1 : 0;
        }


        public string[] UpdateDatosPersonaInpDAO(SIPMaePersona sipMaePersona)
        {
            db.Entry(sipMaePersona).State = EntityState.Modified;
            db.SaveChanges();
            return new String[] { sipMaePersona.nIdePersona.ToString()};
        }

        public SIPMaePersona personaByIdDAO(int n_IdePersona)
        {
            return db.SIPMaePersona.Where(x => x.nIdePersona == n_IdePersona).FirstOrDefault();
        }

        public List<SIPDetBoletaNota> ListaNotasPersonaDAO(int id_Centro)
        {
            return db.SIPDetBoletaNota.Where(s => s.nIdeCentroEstudio == id_Centro && (s.dFecFinVig == null ? DateTime.Now : s.dFecFinVig) >= DateTime.Now && s.dFecIniVige <= DateTime.Now).ToList();
        }

        public SIPMaePersona RegistraPatrimonioManteDAO(int n_IdeTipoBien, string n_IdeSubTipo, string n_AnioBien, string d_FecReside, 
                                                        decimal n_Valor, int n_IdeUsuario, int n_IdePersona)
        {
            DateTime hoy = UtilitariosUtil.FechaHoy();
            SIPDetPatrimonio sipDetPatrimonio = new SIPDetPatrimonio();
            sipDetPatrimonio.nIdePersona = n_IdePersona;
            sipDetPatrimonio.nIdeUsuReg = n_IdeUsuario;
            sipDetPatrimonio.dtFecReg = DateTime.Now;
            sipDetPatrimonio.dFecIniVig = hoy;
            sipDetPatrimonio.nIdeTipoBien = n_IdeTipoBien;
            if (!string.IsNullOrEmpty(n_IdeSubTipo)) sipDetPatrimonio.nIdeSubTipo = Int32.Parse(n_IdeSubTipo);
            if (!string.IsNullOrEmpty(n_AnioBien)) sipDetPatrimonio.nAnioBien = Int32.Parse(n_AnioBien);
            if (!string.IsNullOrEmpty(d_FecReside)) sipDetPatrimonio.dFecReside = UtilitariosUtil.formatearFecha(d_FecReside);
            sipDetPatrimonio.nValor = n_Valor;

            db.SIPDetPatrimonio.Add(sipDetPatrimonio);
            db.SaveChanges();
            db = new BDSIPFEEntities();
            return db.SIPMaePersona.Where(x => x.nIdePersona == n_IdePersona).FirstOrDefault();
        }

    }
}
